﻿//该实例演示了如何使用反汇编的功能

//_set_bin_str 如果要执行手写2进制代码 请先调用这个函数转换2进制 2进制写法使用 \xff
//转换后的2进制保存在()的第一个参数中; 第2个参数为二进制的长度 不是字符串的长度 比如 "\xff\xee" 长度为2

//_asm_dis函数反汇编一段2进制代码 参数:
//() 第一个参数为反汇编后的汇编代码保存buf 应该使用String
//() 第二个参数为是否在每行汇编前面加上地址 如输出为 0x12345678: mov edx, eax 0表示不添加 1表示添加
//() 第三个参数为每行汇编代码最后以什么字符断开 下面的代码中使用"\r\n" 表示空一行
//<<第一个参数为需要反汇编的2进制缓冲区, 注意这个参数不接受"\xff\xee" 这样的写法
//<<第二个参数为该2进制的长度
//<<第三个参数为反汇编的2进制代码在进程中的基地址
//<<第四个参数为反汇编的类型是32位还是64位
//<<第五个参数为反汇编的2进制输入为哪个目标CPU的指令 3表示 UD_SYN_INTEL 所有类型如下: (请勿填写UD_SYN_INTEL)
//UD_SYN_INTEL          3
//UD_SYN_ATT            4
//UD_EOI                -1
//UD_INP_CACHE_SZ       32
//UD_VENDOR_AMD         0
//UD_VENDOR_INTEL       1
//UD_VENDOR_ANY         2

//_asm_rbcode 函数的功能为将2进制代码翻译成指定的目标CPU指令后运行这段代码 目前只支持32位 UD_SYN_INTEL 3 类型 
//()第一个参数为NULL
//<<第一个参数为2进制代码的缓冲区
//<<第二个参数为2进制代码的长度
//<<第三个参数为这段2进制数据在远程进程中的基地址
//<<第4 5个参数跟上面 _asm_dis 参数一致

wpcode
{
	//反汇编演示
	string str_code = "";
	asm::_set_bin_str(str_code, 21)<<"\x90\x90\x2A\x00\x2C\x00\x64\xAF\x87\x77\x8B\xDE\x23\xDF\xD3\xEF\xE9\x14\x1C\x05\x00";
	asm::_asm_dis(str_code, 1, "\r\n")<<str_code<<21<<0x77839AD6<<32<<3;
	call _print(3, "2进制反汇编如下:\r\n", str_code, "\r\n");
	
	asm::_set_bin_str(str_code, 14)<<"\x89\x7A\x04\x0B\xFF\x74\x1E\x83\xC9\xFF\x33\xC0\xF2\xAE";
	asm::_asm_dis(str_code, 0, "\r\n")<<str_code<<14<<0x77E8FA0F<<32<<3;
	call _print(3, "2进制反汇编如下:\r\n", str_code, "\r\n");
	
	dword dw_addr = 0x3f90, dw_size = 8, dw_addsize = 0;
	bool b_ret = 0;
	//这里为打开mfc_wp.exe进程  读取mfc_wp.exe模块中 基地址+0x3f90位置的2进制代码 长度为8字节
	//关于这个函数的意图请查看项目中回调函数的代码
	call _get_proc_module_byte("mfc_wp.exe", "mfc_wp.exe", dw_addr, str_code, dw_size, b_ret);
	if (b_ret == 1)
	{
		aasm::_asm_rbcode(NULL)<<str_code<<dw_size<<dw_addr+0x3f90<<32<<3;
		int eax = 12;
		asm::_get_reg(eax)<<"eax";
		call _print(3, "运行远程线程中的代码, eax = ", eax, "\r\n");
	}
	else
	{
		call _print(1, "无法打开该进程, 请确定进程存在..\r\n");
	}
	
	asm::_set_bin_str(str_code, 8)<<"\x33\xC0\x83\xC0\x01\x83\xC0\x0B";
	asm::_asm_rbcode(NULL)<<str_code<<8<<0<<32<<3;
	int eax = 0;
	asm::_get_reg(eax)<<"eax";
	call _print(3, "运行硬编码的2进制数据, eax = ", eax, "\r\n");
	return 0;
}